﻿using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System;
using System.ServiceModel;
using System.Collections.Generic;
using Sinacor.Infra.Service.Security.Services;

namespace Sinacor.Servico.Bovespa.Contabil.Service.ServiceContract
{
    /// <summary>
    /// Service.ServiceContract Interface - IContaContabilFaturamento
    /// </summary>
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Contabil.Service.ServiceContract", SessionMode = SessionMode.Allowed, Name = "IContaContabilFaturamento")]
    public interface IContaContabilFaturamento
    {
        #region AlterarContaContabilFaturamento

        /// <summary>
        /// Serviço irá alterar o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="request">DataContract.Request.ContaContabilFaturamentoRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "AlterarContaContabilFaturamento")]
        [OperationLog]
        void AlterarContaContabilFaturamento(DataContract.Request.ContaContabilFaturamentoRequest request);

        #endregion

        #region AlterarContasContabeisFaturamento

        /// <summary>
        /// Serviço irá alterar uma coleção de ContasContabeisFaturamento informados como parâmetro
        /// </summary>
        /// <param name="request">Lista de objetos do tipo DataContract.Request.ContaContabilFaturamentoRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "AlterarContasContabeisFaturamento")]
        [OperationLog]
        [TransactionRequired]
        void AlterarContasContabeisFaturamento(List<DataContract.Request.ContaContabilFaturamentoRequest> request);

        #endregion

        #region ConsultarContasContabeisFaturamento

        /// <summary>
        /// Serviço irá Consultar uma lista de ContasContabeisFaturamento, utilizando o parâmetro informado
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroContaContabilFaturamentoRequest</param>
        /// <returns>Lista de objetos do tipo DataContract.Response.ContaContabilFaturamentoResponse</returns>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ConsultarContasContabeisFaturamento")]
        [OperationLog]
        List<DataContract.Response.ContaContabilFaturamentoResponse> ConsultarContasContabeisFaturamento(DataContract.Request.FiltroContaContabilFaturamentoRequest request);

        #endregion

        #region ConsultarPlanosContas

        /// <summary>
        /// Consulta as contas cadastradas no plano de contas
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroPlanoContaRequest</param>
        /// <returns>Lista de objetos do tipo DataContract.Response.PlanoContaResponse</returns>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ConsultarPlanosContas")]
        [OperationLog]
        List<DataContract.Response.PlanoContaResponse> ConsultarPlanosContas(DataContract.Request.FiltroPlanoContaRequest request);

        #endregion

        #region ExcluirContaContabilFaturamento

        /// <summary>
        /// Serviço irá excluir o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroContaContabilFaturamentoChaveRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExcluirContaContabilFaturamento")]
        [OperationLog]
        void ExcluirContaContabilFaturamento(DataContract.Request.FiltroContaContabilFaturamentoChaveRequest request);

        #endregion

        #region ExcluirContasContabeisFaturamento

        /// <summary>
        /// Serviço irá excluir uma coleção de ContasContabeisFaturamento informados como parâmetro
        /// </summary>
        /// <param name="request">Lista de objetos do tipo DataContract.Request.FiltroContaContabilFaturamentoChaveRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExcluirContasContabeisFaturamento")]
        [OperationLog]
        [TransactionRequired]
        void ExcluirContasContabeisFaturamento(List<DataContract.Request.FiltroContaContabilFaturamentoChaveRequest> request);

        #endregion

        #region ExecutarTransacoesContaContabilFaturamento

        /// <summary>
        /// Serviço irá excluir/incluir/alterar os objetos ContaContabilFaturamento informados como parâmetro
        /// </summary>
        /// <param name="exclusaoList">Lista de objetos do tipo DataContract.Request.FiltroContaContabilFaturamentoChaveRequest</param>
        /// <param name="inclusaoList">Lista de objetos do tipo DataContract.Request.ContaContabilFaturamentoRequest</param>
        /// <param name="alteracaoList">Lista de objetos do tipo DataContract.Request.ContaContabilFaturamentoRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExecutarTransacoesContaContabilFaturamento")]
        [OperationLog]
        [TransactionRequired]
        void ExecutarTransacoesContaContabilFaturamento(List<DataContract.Request.FiltroContaContabilFaturamentoChaveRequest> exclusaoList,
                                                        List<DataContract.Request.ContaContabilFaturamentoRequest> inclusaoList,
                                                        List<DataContract.Request.ContaContabilFaturamentoRequest> alteracaoList);

        #endregion

        #region IncluirContaContabilFaturamento

        /// <summary>
        /// Serviço irá incluir o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="request">DataContract.Request.ContaContabilFaturamentoRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "IncluirContaContabilFaturamento")]
        [OperationLog]
        void IncluirContaContabilFaturamento(DataContract.Request.ContaContabilFaturamentoRequest request);

        #endregion

        #region IncluirContasContabeisFaturamento

        /// <summary>
        /// Serviço irá incluir uma coleção de ContasContabeisFaturamento informados como parâmetro
        /// </summary>
        /// <param name="request">Lista de objetos do tipo DataContract.Request.ContaContabilFaturamentoRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "IncluirContasContabeisFaturamento")]
        [OperationLog]
        [TransactionRequired]
        void IncluirContasContabeisFaturamento(List<DataContract.Request.ContaContabilFaturamentoRequest> request);

        #endregion

        #region ObterContaContabilFaturamento

        /// <summary>
        /// Serviço irá Obter o ContaContabilFaturamento informado como parâmetro
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroContaContabilFaturamentoChaveRequest</param>
        /// <returns>DataContract.Response.ContaContabilFaturamentoResponse</returns>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ObterContaContabilFaturamento")]
        [OperationLog]
        DataContract.Response.ContaContabilFaturamentoResponse ObterContaContabilFaturamento(DataContract.Request.FiltroContaContabilFaturamentoChaveRequest request);

        #endregion
    }
}
